home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / netz / magplip / source / port.asm < prev    next >
Assembly Source File  |  1995-08-20  |  11KB  |  315 lines

  1. ;
  2. ;  $VER: port.asm 1.1 (20 Aug 1995)
  3. ;
  4. ;  magplip.device - Parallel Line Internet Protocol
  5. ;
  6. ;  Assembler routines for efficient port handling.
  7. ;
  8. ;  Original code written by Oliver Wagner and Michael Balzer.
  9. ;
  10. ;  This version has been completely reworked by Marius Gröger, introducing
  11. ;  slight protocol changes. The new source is a lot better organized and
  12. ;  maintainable.
  13. ;
  14. ;  Additional changes and code cleanup by Jan Kratochvil and Martin Mares.
  15. ;  The new source is significantly faster and yet better maintainable.
  16. ;
  17. ;  (C) Copyright 1993-1994 Oliver Wagner & Michael Balzer
  18. ;  (C) Copyright 1995 Marius Gröger
  19. ;  (C) Copyright 1995 Jan Kratochvil & Martin Mares
  20. ;      All Rights Reserved
  21. ;
  22. ;  $HISTORY:
  23. ;
  24. ;  20 Aug 1995 : 001.001 :  + removed need for conditional compiling, as we
  25. ;                             we want a generic, symmetrical code
  26. ;                           + in interrupt handlers, A6 points already to
  27. ;                             SysBase
  28. ;                           + using JSRLIB/JMPLIB macros
  29. ;                           + removed implicit some assumptions on the values
  30. ;                             behind symbolic names
  31. ;  13 Feb 1995 : 001.000 :  created (in fact manually compiled from 'C'-
  32. ;                           original) (jk/mm)
  33. ;
  34.       section "text",code
  35.  
  36.       IFND HARDARE_CIA_I
  37.       include "hardware/cia.i"
  38.       ENDC
  39.  
  40.       IFND EXEC_MACROS_I
  41.       include "exec/macros.i"
  42.       ENDC
  43.  
  44.       IFND MAGPLIP_I
  45.       include "magplip.i"
  46.       ENDC
  47.  
  48. ciaa     equ     $bfe001
  49. ciab     equ     $bfd000
  50. BaseA5   equ     ciab+ciapra
  51.  
  52.       xref    _CRC16
  53.  
  54.       xdef    _interrupt
  55.       xdef    _hwsend
  56.       xdef    _hwrecv
  57.  
  58. ;----------------------------------------------------------------------------
  59. ;
  60. ; NAME
  61. ;     interrupt() - ICR FLG interrupt handler
  62. ;
  63. ; SYNOPSIS
  64. ;     void interrupt(struct PLIPBase *)
  65. ;                    A1
  66. ;
  67. ; FUNCTION
  68. ;     This is called from the CIA resource on the receipt of an Flag-
  69. ;     interrupt. This is the case if the other side starts transmission
  70. ;     and writes the first byte to our port.
  71. ;     We recognise this here and propagate the information to the server
  72. ;     task by Signal()ing it and by setting the PLIPB_RECEIVING bit
  73. ;     in the flags field.
  74. ;
  75. _interrupt:
  76.         btst    #PLIPB_RECEIVING,pb_Flags(a1)
  77.         bne     skipint
  78.         move.b  pb_HandshakeBit+HS_LINE(a1),d0
  79.         btst    d0,ciab+ciapra
  80.         beq     skipint
  81.         bset    #PLIPB_RECEIVING,pb_Flags(a1)
  82.         move.l  pb_IntSigMask(a1),d0
  83.         move.l  pb_Server(a1),a1
  84.         JMPLIB  Signal
  85. skipint rts
  86.  
  87. ;----------------------------------------------------------------------------
  88. ;
  89. ; NAME
  90. ;     hwsend() - low level send routine
  91. ;
  92. ; SYNOPSIS
  93. ;     void hwsend(struct PLIPBase *)
  94. ;                  A0
  95. ;
  96. ; FUNCTION
  97. ;     This routine sends the PLIPBase->pb_SendFrame to the other side. It
  98. ;     cares for CRC encoding, if wanted.
  99. ;
  100. _hwsend:
  101.          movem.l  d2-d7/a2-a3/a5-a6,-(sp)
  102.          move.l   a0,a2                               ; a2 = PLIPBase
  103.          pea      FALSE                               ; (sp) = return value
  104.          moveq    #0,d3
  105.          move.l   d3,d4
  106.          move.b   pb_HandshakeBit+HS_REQUEST(a2),d3   ; d3 = HS_REQUEST
  107.          move.b   pb_HandshakeBit+HS_LINE(a2),d4      ; d4 = HS_LINE
  108.  
  109.          ;
  110.          ; CRC wanted ?
  111.          ;
  112.          btst     #PLIPB_SENDCRC,pb_Flags(a2)
  113.          beq      hww_NoCRC
  114.          ; yes
  115.          move.w   #SYNCWORD_CRC,pb_SendFrame+pf_Sync(a2)
  116.          lea      pb_SendFrame+pf_data(a2),a0
  117.          move.w   pb_SendFrame+pf_Size(a2),d0
  118.          subq.w   #PKTFRAMESIZE_2,d0
  119.          jsr      _CRC16(pc)
  120.          move.w   d0,pb_SendFrame+pf_CRC(a2)
  121.          bra.s    hww_CRC
  122.  
  123. hww_NoCRC:
  124.          move.w   #SYNCWORD_NOCRC,pb_SendFrame+pf_Sync(a2)
  125.  
  126. hww_CRC  move.l   pb_CIAABase(a2),a6
  127.          moveq    #CIAICRF_FLG,d0
  128.          JSRLIB   AbleICR                             ; DISABLEINT
  129.          lea      BaseA5,a5
  130.          st       ciaa+ciaddrb-BaseA5(a5)             ; SETCIAOUTPUT
  131.          move.b   (a5),d7                             ; SAMPLEINPUT, d7 = State
  132.          lea      pb_SendFrame(a2),a3
  133.          move.w   pb_SendFrame+pf_Size(a2),d6
  134.          addq.w   #PKTFRAMESIZE_1-2,d6
  135.          move.l   pb_Timeout(a2),d5
  136.          move.b   (a3)+,ciaa+ciaprb-BaseA5(a5)        ; WRITECIA *p++
  137.          move.l   d5,d2                               ; initially we wait
  138.          add.l    d2,d2                               ; 2*Timeout
  139.          move.w   d2,d1
  140.          swap     d2
  141. hww_LoopShake1:
  142.          move.b   (a5),d0                             ; ciab+ciapra
  143.          eor.b    d7,d0
  144.          btst     d4,d0                               ; WAITINPUTTOGGLE
  145.          dbne     d1,hww_LoopShake1
  146.          dbne     d2,hww_LoopShake1
  147.          beq      hww_TimedOut
  148.          eor.b    d0,d7
  149.  
  150. hww_MainLoop:
  151.          move.b   (a3)+,ciaa+ciaprb-BaseA5(a5)        ; WRITECIA *p++
  152.          bchg     d3,(a5)                             ; OUTPUTTOGGLE
  153.          move.l   d5,d2
  154.          move.w   d2,d1
  155.          swap     d2
  156. hww_LoopShake2:
  157.          move.b   (a5),d0                             ; ciab+ciapra
  158.          eor.b    d7,d0
  159.          btst     d4,d0                               ; WAITINPUTTOGGLE
  160.          dbne     d1,hww_LoopShake2
  161.          dbne     d2,hww_LoopShake2
  162.          beq      hww_TimedOut
  163.          eor.b    d0,d7
  164.          dbra     d6,hww_MainLoop
  165.          move.l   #TRUE,(sp)                          ; rc = TRUE
  166. hww_TimedOut:
  167.          sf       ciaa+ciaddrb-BaseA5(a5)             ; SETCIAINPUT
  168.          bclr     d3,(a5)                             ; CLEARREQUEST ciab+ciapra
  169.          moveq    #CIAICRF_FLG,d0
  170.          JSRLIB   SetICR                              ; CLEARINT
  171.          move.w   #CIAICRF_FLG|CIAICRF_SETCLR,d0
  172.          JSRLIB   AbleICR                             ; ENABLEINT
  173.  
  174.          move.l   (sp)+,d0                            ; return rc
  175.          movem.l  (sp)+,d2-d7/a2-a3/a5-a6
  176. Return   rts
  177.  
  178.  
  179. ;----------------------------------------------------------------------------
  180. ;
  181. ; NAME
  182. ;     hwrecv() - low level receive routine
  183. ;
  184. ; SYNOPSIS
  185. ;     void hwrecv(struct PLIPBase *)
  186. ;                 A0
  187. ;
  188. ; FUNCTION
  189. ;     This routine receives a magPLIP frame and stores it into
  190. ;     PLIPBase->pb_ReceiveFrame. It cares for CRC decoding, if the incoming
  191. ;     packet is encoded.
  192. ;
  193. _hwrecv:
  194.          movem.l  d2-d7/a2-a6,-(sp)
  195.          move.l   a0,a2                               ; a2 = PLIPBase
  196.          pea      FALSE                               ; (sp) = return value
  197.          move.l   pb_CIAABase(a2),a6                  ; a6 = CIABase
  198.          move.l   pb_Timeout(a2),a4                   ; a4 = Timeout
  199.          moveq    #0,d3
  200.          move.l   d3,d5
  201.          move.b   pb_HandshakeBit+HS_REQUEST(a2),d3   ; d3 = HS_REQUEST
  202.          move.b   pb_HandshakeBit+HS_LINE(a2),d5      ; d5 = HS_LINE
  203.          lea      BaseA5,a5                           ; a5 = ciab+ciapra
  204.  
  205.          moveq    #CIAICRF_FLG,d0
  206.          JSRLIB   AbleICR                             ; DISABLEINT
  207.  
  208.          move.b   (a5),d7                             ; SAMPLEINPUT
  209.          cmp.b    #SYNCBYTE_HEAD,ciaa+ciaprb-BaseA5(a5) ; READCIABYTE
  210.          bne      hwr_TimedOut
  211.  
  212.          bchg     d3,(a5)                             ; OUTPUTTOGGLE
  213.          move.l   a4,d2
  214.          move.w   d2,d1
  215.          swap     d2
  216. hwr_LoopShake1:
  217.          move.b   (a5),d0                             ; ciab+ciapra
  218.          eor.b    d7,d0
  219.          btst     d5,d0                               ; WAITINPUTTOGGLE
  220.          dbne     d1,hwr_LoopShake1
  221.          dbne     d2,hwr_LoopShake1
  222.          beq      hwr_TimedOut
  223.          eor.b    d0,d7
  224.          move.b   ciaa+ciaprb-BaseA5(a5),d4           ; READCIABYTE
  225.          bchg     d3,(a5)                             ; OUTPUTTOGGLE
  226.          move.b   d4,d0
  227.          subq.b   #SYNCBYTE_CRC,d0
  228.          subq.b   #SYNCBYTE_NOCRC,d0
  229.          bcc      hwr_TimedOut
  230.          lea      pb_ReceiveFrame+pf_Size(a2),a3
  231.  
  232.          ; Read 1st length byte
  233.          ;
  234.          move.l   a4,d2
  235.          move.w   d2,d1
  236.          swap     d2
  237. hwr_LoopShake2
  238.          move.b   (a5),d0                             ; ciab+ciapra
  239.          eor.b    d7,d0
  240.          btst     d5,d0                               ; WAITINPUTTOGGLE
  241.          dbne     d1,hwr_LoopShake2
  242.          dbne     d2,hwr_LoopShake2
  243.          beq      hwr_TimedOut
  244.          eor.b    d0,d7
  245.          move.b   ciaa+ciaprb-BaseA5(a5),(a3)+        ; READCIABYTE
  246.          bchg     d3,(a5)                             ; OUTPUTTOGGLE
  247.  
  248.          ; Read 2nd length byte
  249.          ;
  250.          move.l   a4,d2
  251.          move.w   d2,d1
  252.          swap     d2
  253. hwr_LoopShake3:
  254.          move.b   (a5),d0                             ; ciab+ciapra
  255.          eor.b    d7,d0
  256.          btst     d5,d0                               ; WAITINPUTTOGGLE
  257.          dbne     d1,hwr_LoopShake3
  258.          dbne     d2,hwr_LoopShake3
  259.          beq      hwr_TimedOut
  260.          eor.b    d0,d7
  261.          move.b   ciaa+ciaprb-BaseA5(a5),(a3)+        ; READCIABYTE
  262.          bchg     d3,(a5)                             ; OUTPUTTOGGLE ciab+ciapra
  263.  
  264.          move.w   -2(a3),d6                           ; = length
  265.          subq.w   #PKTFRAMESIZE_2,d6
  266.          bcs      hwr_TimedOut
  267.          cmp.w    pb_MTU+2(a2),d6
  268.          bhi      hwr_TimedOut
  269.          addq.w   #PKTFRAMESIZE_2-1,d6
  270.  
  271.          ; Read main packet body
  272.          ;
  273. hwr_MainLoop:
  274.          move.l   a4,d2
  275.          move.w   d2,d1
  276.          swap     d2
  277. hwr_LoopShake4:
  278.          move.b   (a5),d0                             ; ciab+ciapra
  279.          eor.b    d7,d0
  280.          btst     d5,d0
  281.          dbne     d1,hwr_LoopShake4
  282.          dbne     d2,hwr_LoopShake4
  283.          beq      hwr_TimedOut
  284.          eor.b    d0,d7
  285.          move.b   ciaa+ciaprb-BaseA5(a5),(a3)+        ; READCIABYTE
  286.          bchg     d3,(a5)                             ; OUTPUTTOGGLE ciab+ciapra
  287.          dbra     d6,hwr_MainLoop
  288.  
  289. hwr_DoneRead:
  290.          subq.b   #SYNCBYTE_CRC,d4
  291.          bne      hwr_ReadOkay
  292.          lea      pb_ReceiveFrame+pf_data(a2),a0
  293.          move.w   pb_ReceiveFrame+pf_Size(a2),d0
  294.          subq.w   #PKTFRAMESIZE_2,d0
  295.          jsr      _CRC16(pc)
  296.          cmp.w    pb_ReceiveFrame+pf_CRC(a2),d0
  297.          bne      hwr_TimedOut
  298.  
  299. hwr_ReadOkay:
  300.          move.l   #TRUE,(sp)
  301. hwr_TimedOut:
  302.          bclr     #PLIPB_RECEIVING,pb_Flags(a2)
  303.          sf       ciaa+ciaddrb-BaseA5(a5)             ; SETCIAINPUT
  304.          bclr     d3,(a5)                             ; CLEARREQUEST ciab+ciapra
  305.          moveq    #CIAICRF_FLG,d0
  306.          JSRLIB   SetICR                              ; CLEARINT
  307.          move.w   #CIAICRF_FLG|CIAICRF_SETCLR,d0
  308.          JSRLIB   AbleICR                             ; ENABLEINT
  309.  
  310.          move.l   (sp)+,d0                            ; return value
  311.          movem.l  (sp)+,d2-d7/a2-a6
  312.          rts
  313.  
  314.          end
  315.